from . import api
from ihome.utils.common import login_required
from flask import g,request,jsonify,current_app,session
from ihome.utils.response_code import RET
from ihome.utils.image_storage import storage
from ihome import constance
from ihome.models import User
from ihome import db
from sqlalchemy.exc import IntegrityError

# POST http://127.0.0.1:5000/api/v1.0/users/avatar
@api.route("/users/avatar",methods=["POST"])
@login_required
def set_user_avatar():
    """
    设置用户头像
    分析前端传递过来的参数：用户头像，当前用户的id
    """
    # 1.接收参数
    # 获取用户id,由于之前在登录装饰器中设置过用户id，直接提取即可
    user_id = g.user_id
    files = request.files
    print("files=",files,",type=",type(files))
    fileStorage = files.get("avatar")
    # 2. 校验参数
    if not fileStorage:
        return jsonify(errno=RET.PARAMERR, errmsg="请选择要上传的头像")
    # 3.执行业务逻辑
    image_data = fileStorage.read()
    try:
        file_name = storage(image_data)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.THIRDERR,errmsg="上传头像到七牛云平台失败")

    try:
        # 更新用户表中的头像字段
        # update ih_user_profile set avatar_url=hsj.png where id=1
        user = User.query.filter_by(id=user_id).update({"avatar_url":file_name})
        db.session.commit() # 提交事务
    except Exception as e:
        db.session.rollback() # 回滚事务
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg="保存图片信息失败")

    # 4.返回响应结果
    # http://rt1qjteed.hb-bkt.clouddn.com/FocIdY3GazhFPOjWLkv5YPwtWvGz
    avatar_url = constance.QINIU_URL_DOMAIN + file_name
    data={"avatar_url":avatar_url}
    return jsonify(errno=RET.OK,errmsg="OK",data=data)


# PUT http://127.0.0.1:5000/api/v1.0/users/name
@api.route("/users/name",methods=["PUT"])
@login_required
def change_user_name():
    """
    修改用户名
    前端传过来的参数：{"name":"用户名"}
    """
    user_id = g.user_id
    # 1.接收参数
    req_data = request.json
    # 2. 校验参数
    if not req_data: # 判断前端传递过来的参数是否为空
        return jsonify(errno=RET.PARAMERR,errmsg="参数不完整！")

    name = req_data.get("name")
    print("name=",name)
    if not name:
        return jsonify(errno=RET.PARAMERR,errmsg="名字不能为空")
    # 3. 执行业务逻辑
    try:
        # update ih_user_profile set name=name where id=user_id
        User.query.filter_by(id=user_id).update({"name":name})
        db.session.commit()
    except IntegrityError as e:
        db.session.rollback()
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="修改后的用户名和之前的用户名重复")
    except Exception as e:
        db.session.rollback()
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg="设置用户名失败")

    session["name"] = name
    # 4.返回响应结果 # {"errno":0,errmsg:"OK",data:{"name":"修改后的用户名"}}
    return jsonify(errno=RET.OK,errmsg="OK",data={"name":name})

# GET /api/v1.0/users/auth
@api.route("/users/auth",methods=["GET"])
@login_required
def get_user_auth():
    """获取用户的实名认证信息"""
    user_id = g.user_id
    # 在数据库中查询信息
    try:
        user = User.query.get(user_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg="获取用户实名认证信息失败")

    if user is None:
        return jsonify(errno=RET.NODATA,errmsg="无效的操作")

    return jsonify(errno=RET.OK,errmsg="OK",data=user.auth_to_dict())

# PUT /api/v1.0/users/auth
@api.route("/users/auth",methods=["PUT"])
@login_required
def set_user_auth():
    """
    设置实名认证信息
    前端传递json格式的数据：{"real_name":"真实姓名","id_card":"身份证号码"}
    :return:
    """
    user_id = g.user_id
    # 获取参数
    req_data = request.get_json()
    # 校验参数
    if not req_data:
        return jsonify(errno=RET.PARAMERR,errmsg="参数错误")
    # 提取数据
    real_name=req_data.get("real_name")
    id_card=req_data.get("id_card")
    if not all([real_name,id_card]):
        return jsonify(errno=RET.PARAMERR,errmsg="参数不完整")

    try:
        # 保存用户的姓名和身份证号码
        # update ih_user_profile set real_name=真实姓名，id_card=身份证号码
        # where id=user_id and real_name=null and id_card=null
        count=User.query.filter_by(id=user_id,real_name=None,id_card=None).update({"real_name":real_name,"id_card":id_card})
        print("count=",count)
        if count>0:
            db.session.commit()
            print("更新实名认证信息成功")
        else:
            print("更新实名认证信息失败")
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR,errmsg="保存用户实名认证信息失败")

    return jsonify(errno=RET.OK,errmsg="OK")


# GET /api/v1.0/user
@api.route("/user",methods=["GET"])
@login_required
def get_user_profile():
    """
       获取用户个人信息
       :return:
       """
    user_id = g.user_id
    try:
        # 查询数据库，获取个人信息
        user = User.query.get(user_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="获取用户信息失败")

    if user is None:
        return jsonify(errno=RET.NODATA, errmsg="根据用户Id查询用户对象失败")
    return jsonify(errno=RET.OK, errmsg="Ok", data=user.to_dict())



